package cn.tedu.micro.demo.order.service.impl;

import cn.tedu.micro.demo.common.protocol.JsonResult;
import cn.tedu.micro.demo.common.vo.GunInfoVO;
import cn.tedu.micro.demo.order.client.DeviceClient;
import cn.tedu.micro.demo.order.dao.repository.OrderRepository;
import cn.tedu.micro.demo.order.po.OrderInfoPO;
import cn.tedu.micro.demo.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Date;

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private DeviceClient deviceClient;
    private void checkGunAvailable(Integer gunId) {
        //GET HTTP://LOCALHOST:8000/device/gun/info/+gunId
        //1.调用client方法 获取响应数据内容
        JsonResult<GunInfoVO> resultVO = deviceClient.getGunInfo(gunId);
        //2.获取data 在非空的时候 判断他的状态是否==1 如果不等于1 异常结束
        GunInfoVO gunVO = resultVO.getData();
        if (gunVO==null||gunVO.getStatus()!=1){
            throw new RuntimeException("枪的状态不满足下单要求");
        }
    }
    @Override
    public String orderCreate(Integer gunId, Integer userId) {
        //1.读取枪状态 检验是否空闲 如果空闲,则方法异常结束(设计异常类 异常编码等)
        checkGunAvailable(gunId);
        //UNDO 检查用户信誉 是否允许赊账 后支付
        //checkUserXinyu(userId);
        //2.生成billId 订单编号 有序 唯一 可读(高并发生成)
        String billId=generateBillId();
        //3.组织 po 写入数据库
        saveOrder(billId,gunId,userId);
        return billId;
    }

    private void saveOrder(String billId, Integer gunId, Integer userId) {
        //订单写入数据层,数据包含哪些属性 业务决定的
        OrderInfoPO orderInfoPO=new OrderInfoPO();
        //bill_id gun_id user_id create_time update_time
        orderInfoPO.setBillId(billId);
        orderInfoPO.setUserId(userId);
        orderInfoPO.setGunId(gunId);
        orderInfoPO.setCreateTime(new Date());
        orderInfoPO.setUpdateTime(orderInfoPO.getCreateTime());
        //调用数据层 写入数据
        orderRepository.saveOrder(orderInfoPO);

    }

    private String generateBillId() {
        return System.currentTimeMillis()+"";
    }


}
